import * as fs from 'fs';
import * as path from 'path';
import { encryptData, decryptData } from '../src/utils';
import { MDZFile } from '../src/mdzFile';

/**
 * 测试基础加密解密功能
 */
async function testBasicEncryption() {
  console.log('--- 测试基础加密解密功能 ---');
  
  const originalText = '这是一段需要加密的测试文本。包含一些特殊字符：!@#$%^&*()_+{}:"<>?';
  const password = 'test123';
  
  console.log(`原始文本: ${originalText}`);
  
  try {
    // 加密数据
    console.log('进行加密...');
    const encrypted = encryptData(originalText, password);
    console.log(`加密后数据 (前50字符): ${encrypted.substring(0, 50)}...`);
    
    // 解密数据
    console.log('进行解密...');
    const decrypted = decryptData(encrypted, password);
    console.log(`解密后文本: ${decrypted}`);
    
    // 验证结果
    if (decrypted === originalText) {
      console.log('✅ 测试通过: 解密后文本与原始文本一致');
    } else {
      console.error('❌ 测试失败: 解密后文本与原始文本不一致');
    }
  } catch (err) {
    console.error('❌ 测试过程中发生错误:', err);
  }
}

/**
 * 测试MDZ文件加密解密
 */
async function testMDZEncryption() {
  console.log('\n--- 测试MDZ文件加密解密 ---');
  
  const testFilePath = path.join(__dirname, '../encryption-test.mdz');
  const password = 'test-password-123';
  const originalContent = `# 加密测试文档

这是一个用于测试MDZ文件加密和解密功能的文档。

## 特点
- 包含Markdown格式
- 使用密码加密
- 需要正确解密

> 这是一段引用内容

\`\`\`javascript
// 这是一段代码块
function test() {
  console.log("Hello MDZ!");
}
\`\`\`

测试结束。
`;
  
  try {
    // 创建加密MDZ文件
    console.log('创建加密MDZ文件...');
    const mdz = new MDZFile(testFilePath);
    await mdz.create(originalContent, {
      title: '加密测试文档',
      author: '测试用户',
      password: password
    });
    
    await mdz.save();
    await mdz.close();
    console.log(`加密MDZ文件已创建: ${testFilePath}`);
    
    // 重新打开并解密
    console.log('\n尝试打开并解密MDZ文件...');
    const mdzOpen = new MDZFile(testFilePath);
    await mdzOpen.open(password);
    
    // 读取解密后的内容
    const decryptedContent = await mdzOpen.getMainContent();
    console.log('成功获取解密内容');
    
    // 显示部分内容
    console.log(`解密内容 (前100字符): ${decryptedContent.substring(0, 100)}...`);
    
    // 验证结果
    if (decryptedContent === originalContent) {
      console.log('✅ 测试通过: 解密后内容与原始内容一致');
    } else {
      console.error('❌ 测试失败: 解密后内容与原始内容不一致');
      
      // 详细比较
      let firstDiff = -1;
      for (let i = 0; i < Math.min(originalContent.length, decryptedContent.length); i++) {
        if (originalContent[i] !== decryptedContent[i]) {
          firstDiff = i;
          break;
        }
      }
      
      if (firstDiff !== -1) {
        console.error(`首个不匹配位置: 索引 ${firstDiff}`);
        console.error(`原始内容: "${originalContent.substring(Math.max(0, firstDiff - 10), firstDiff + 10)}"`);
        console.error(`解密内容: "${decryptedContent.substring(Math.max(0, firstDiff - 10), firstDiff + 10)}"`);
      }
    }
    
    // 关闭文件
    await mdzOpen.close();
    
    // 删除测试文件
    fs.unlinkSync(testFilePath);
    console.log(`已删除测试文件: ${testFilePath}`);
  } catch (err) {
    console.error('❌ 测试过程中发生错误:', err);
    
    // 清理测试文件
    if (fs.existsSync(testFilePath)) {
      fs.unlinkSync(testFilePath);
    }
  }
}

/**
 * 测试错误密码情况
 */
async function testWrongPassword() {
  console.log('\n--- 测试错误密码情况 ---');
  
  const testFilePath = path.join(__dirname, '../wrong-password-test.mdz');
  const correctPassword = 'correct-password';
  const wrongPassword = 'wrong-password';
  const content = '这是测试错误密码的内容';
  
  try {
    // 创建加密MDZ文件
    console.log('创建加密MDZ文件...');
    const mdz = new MDZFile(testFilePath);
    await mdz.create(content, {
      title: '密码测试',
      password: correctPassword
    });
    
    await mdz.save();
    await mdz.close();
    
    // 尝试用错误密码打开
    console.log('尝试用错误密码打开...');
    const mdzOpen = new MDZFile(testFilePath);
    
    try {
      await mdzOpen.open(wrongPassword);
      console.error('❌ 测试失败: 使用错误密码仍然能打开文件');
    } catch (err) {
      console.log('✅ 测试通过: 使用错误密码无法打开文件');
      console.log(`错误信息: ${err}`);
    } finally {
      await mdzOpen.close();
    }
    
    // 尝试用正确密码打开
    console.log('\n尝试用正确密码打开...');
    const mdzOpenCorrect = new MDZFile(testFilePath);
    
    try {
      await mdzOpenCorrect.open(correctPassword);
      const retrievedContent = await mdzOpenCorrect.getMainContent();
      
      if (retrievedContent === content) {
        console.log('✅ 测试通过: 使用正确密码成功打开文件并获取正确内容');
      } else {
        console.error('❌ 测试失败: 使用正确密码打开文件但内容不匹配');
      }
    } catch (err) {
      console.error('❌ 测试失败: 使用正确密码仍然无法打开文件');
      console.error(`错误信息: ${err}`);
    } finally {
      await mdzOpenCorrect.close();
    }
    
    // 删除测试文件
    fs.unlinkSync(testFilePath);
  } catch (err) {
    console.error('❌ 测试过程中发生错误:', err);
    
    // 清理测试文件
    if (fs.existsSync(testFilePath)) {
      fs.unlinkSync(testFilePath);
    }
  }
}

/**
 * 运行所有测试
 */
async function runTests() {
  await testBasicEncryption();
  await testMDZEncryption();
  await testWrongPassword();
  console.log('\n所有测试完成');
}

// 如果直接运行此文件，则执行测试
if (require.main === module) {
  runTests().catch(console.error);
} 